# 工具链定义
CC = riscv64-unknown-elf-gcc
OBJCOPY = riscv64-unknown-elf-objcopy
QEMU = qemu-system-riscv64

# 编译选项
CFLAGS = -Wall -O2 -ffreestanding -nostdlib \
         -march=rv64imac -mabi=lp64 -mcmodel=medany

# 链接选项
LDFLAGS = -nostdlib -ffreestanding -Wl,--gc-sections -T kernel/kernel.ld

# 源文件与目标文件
SRCS = kernel/entry.S kernel/uart.c kernel/main.c
OBJS = entry.o uart.o main.o

# 目标文件
TARGET_ELF = kernel.elf
TARGET_BIN = kernel.bin

# 默认目标：编译并生成ELF和二进制镜像
all: $(TARGET_ELF) $(TARGET_BIN)

# 编译汇编文件
entry.o: kernel/entry.S
	$(CC) $(CFLAGS) -c $< -o $@

# 编译C文件
uart.o: kernel/uart.c
	$(CC) $(CFLAGS) -c $< -o $@

main.o: kernel/main.c
	$(CC) $(CFLAGS) -c $< -o $@

# 链接生成ELF文件
$(TARGET_ELF): $(OBJS)
	$(CC) $(LDFLAGS) $^ -o $@

# 转换为二进制镜像
$(TARGET_BIN): $(TARGET_ELF)
	$(OBJCOPY) -O binary $< $@

# 运行QEMU（使用ELF文件）
run: $(TARGET_ELF)
	$(QEMU) -machine virt -nographic -m 128M -bios none -kernel $<

# 运行QEMU（使用二进制镜像）
run-bin: $(TARGET_BIN)
	$(QEMU) -machine virt -nographic -m 128M -bios none -kernel $<

# 清理生成文件
clean:
	rm -f $(OBJS) $(TARGET_ELF) $(TARGET_BIN)

# 伪目标（避免与同名文件冲突）
.PHONY: all run run-bin clean